package pe.gob.osce.sirenas.dao.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ResourceBundle;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import pe.gob.osce.sirenas.dao.AcreditacionDAOLocal;
import pe.gob.osce.sirenas.dao.AreaProfesionDAOLocal;
import pe.gob.osce.sirenas.dao.convert.AcreditacionConvert;
import pe.gob.osce.sirenas.dao.convert.AreaProfesionConvert;
import pe.gob.osce.sirenas.model.AcreditacionDTO;
import pe.gob.osce.sirenas.model.AreaProfesionDTO;
import pe.gob.osce.sirenas.model.jpa.Acreditacion;
import pe.gob.osce.sirenas.model.jpa.AreaProfesion;
import pe.gob.osce.sirenas.model.jpa.Docencia;
import pe.gob.osce.sirenas.util.ConstanteEJB;
import pe.gob.osce.sirenas.util.ModeloException;



@Stateless
public class AcreditacionDAOImpl implements AcreditacionDAOLocal {

	@PersistenceContext(unitName="pe.gob.osce.sirenas.be.pu" )
	private	EntityManager	em;
	ResourceBundle propSirenas = ResourceBundle.getBundle(ConstanteEJB.PROPERTIES);

	@Override 
	public List<AcreditacionDTO> listarAcreditacion(Long idFicha) throws Exception{

		List<AcreditacionDTO> listAcreditacionDTO=null;
		List<Acreditacion> listaAcreditacionJPA=null;
		try{
			StringBuilder  	jpql= new StringBuilder();
						
			jpql.append("SELECT ac FROM Acreditacion ac WHERE ac.estado= 1");
			jpql.append(" AND ac.idFicha = :idFicha");
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha", idFicha);
			
			List<Acreditacion>	listaObjeto= query.getResultList();
			
			if(!listaObjeto.isEmpty()) {
				listaAcreditacionJPA=new ArrayList<Acreditacion>();
				for (Acreditacion obj: listaObjeto) {					
					listaAcreditacionJPA.add(obj);
				}
				listAcreditacionDTO=AcreditacionConvert.createListaAcreditacionDTO(listaAcreditacionJPA);
			}
			

		} catch (NoResultException nre) {
			 listAcreditacionDTO=new ArrayList<AcreditacionDTO>();
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}
		return listAcreditacionDTO;
	}
	

	
	
	@Override
	public Acreditacion insertAcreditacion(Acreditacion acreditacion)throws Exception {
		try{
			em.merge(acreditacion);
			em.flush();
		} catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_INSERT), e);
		}
		return acreditacion;
	}

	@Override 
	public List<AcreditacionDTO> obtenerReporteAcreditaciones(Long idFicha,List<Integer> especialidades) throws Exception {
		List<AcreditacionDTO> listaAcreditaciones=new ArrayList<AcreditacionDTO>();
		try{
			StringBuilder  	jpql= new StringBuilder();
			
			jpql.append(" SELECT acr FROM Acreditacion acr WHERE acr.estado=1 AND acr.idFicha=:idFicha ");
			
			if(!especialidades.isEmpty()){jpql.append(" AND acr.indEspecialidad IN(:esp01,:esp02,:esp03)");}
			
			Query	query= em.createQuery( jpql.toString() );
			query.setParameter("idFicha",idFicha);
			String parametro;
			Integer valor;
			if(!especialidades.isEmpty()){	
				for (int i = 0; i < 3; i++) {
					parametro="esp0"+(i+1);
					try {
						valor=Integer.parseInt(""+especialidades.get(i));
						query.setParameter(parametro,valor );
					} catch (Exception e) {
						query.setParameter(parametro,0 );
					}
				}
			}			
			
			List<Acreditacion>	listaObjeto=(List)query.getResultList();			
			if(!listaObjeto.isEmpty()) {
				for (Acreditacion acreditacion : listaObjeto) {					
					listaAcreditaciones.add(AcreditacionConvert.createAcreditacionDTO( acreditacion));
				}	
			}
			
		} catch (NoResultException nre) {
			listaAcreditaciones=null;
			 throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_NO_DATA));
		}catch (Exception e) {
			throw new ModeloException(propSirenas.getString(ConstanteEJB.EXC_MODELO_GENERAL_DB), e);
		}		
		return listaAcreditaciones;
	}

}
